package com.enjoy.xbase.web;

import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Build;
import android.view.View;
import android.webkit.DownloadListener;
import android.webkit.SslErrorHandler;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import java.util.HashMap;
import java.util.Map;

public class BaseWebActivity {
    private WebView mWebView;

    private void initWebView() {
        //开启调试模式
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            mWebView.setWebContentsDebuggingEnabled(true);
        }

        /**
         * LOAD_CACHE_ONLY: 不使用网络，只读取本地缓存数据
         * LOAD_DEFAULT: （默认）根据cache-control决定是否从网络上取数据。
         * LOAD_NO_CACHE: 不使用缓存，只从网络获取数据.
         * LOAD_CACHE_ELSE_NETWORK，只要本地有，无论是否过期，或者no-cache，都使用缓存中的数据。
         */
        mWebView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT);
        mWebView.getSettings().setAppCacheEnabled(true);
        mWebView.getSettings().setAppCacheMaxSize(Long.MAX_VALUE);

        /* 当网页需要保存数时据,设置下面属性 支持DOM API */
        mWebView.getSettings().setDomStorageEnabled(true);

        //是否支持<meta>标签的viewport属性
        mWebView.getSettings().setUseWideViewPort(true);//设置webview推荐使用的窗口，使html界面自适应屏幕
        mWebView.getSettings().setLoadWithOverviewMode(true);//缩放至屏幕的大小
        mWebView.getSettings().setAllowFileAccess(true);// 可以访问文件
        mWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);//开启硬件加速
        /* 提高网页渲染的优先级 */
        mWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);

        //设置播放flash相关
        //webView.getSettings().setPluginState(WebSettings.PluginState.ON_DEMAND);

        /* 设置支持Js,必须设置的,基本大多数网页都涉及js */
        mWebView.getSettings().setJavaScriptEnabled(true);
        /* 设置为true时表示支持使用js打开新的窗口 */
        mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(false);

        /* 设置是否显示水平滚动条 */
        mWebView.setHorizontalScrollBarEnabled(false);
        /* 设置垂直滚动条是否有叠加样式 */
        mWebView.setVerticalScrollbarOverlay(false);
        /* 设置滚动条的样式 */
        mWebView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);

        /* 设置是否允许webview使用缩放的功能 */
        //webView.getSettings().setBuiltInZoomControls(true);
        /*是否可以缩放，默认true*/
        //webView.getSettings().setSupportZoom(false);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
            //webView.getSettings().setMixedContentMode(WebSettings.LOAD_NORMAL);//处理http 和 https 图片混合的问题
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.TEXT_AUTOSIZING);
        } else {
            mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
        }


        mWebView.setWebViewClient(new BaseWebViewClient());

        //mWebView.setWebChromeClient(new BaseWebChromeClient());

        mWebView.setDownloadListener(new DownloadListener() {
            @Override
            public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
                //跳转到浏览器下载
                //downloadByBrowser(url);
            }
        });
        //initJavascriptInterface(webView);
    }

    protected boolean filterUrl(String url) {
        return false;
    }

    /**
     * 描述：开始加载页面
     */
    protected void onPageStarted(String url) {

    }

    /**
     * 描述：完成加载
     *
     * @param url
     */
    protected void onPageFinished(String url) {

    }

    protected void onPageErr() {

    }

    class BaseWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView webView, String url) {
            // 可以解决由于重定向导致的webview.goback()无法返回的问题
            if (filterUrl(url)) {
                return true;
            } else {
                webView.setWebViewClient(this);
                Map<String, String> header = new HashMap<>();
                header.put("Cache-Control", "max-age=0");
                webView.loadUrl(url, header);
                return true;
            }
        }


        @Override
        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            handler.proceed();// 接受所有网站的证书
            super.onReceivedSslError(view, handler, error);
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            BaseWebActivity.this.onPageStarted(url);
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            BaseWebActivity.this.onPageFinished(url);
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
            BaseWebActivity.this.onPageErr();
        }
    }
}
